package org.linotte.net;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;

import org.linotte.greffons.externe.Greffon;

public class TCPClient extends Greffon {

	private Socket socket;
	private boolean debug = false;

	@Slot
	public boolean connexion(String url, int port) throws GreffonException {
		try {
			//if (socket != null)
			//	throw new GreffonException("Le socket est déjà ouvert");
			socket = new Socket(url, port);
			return true;
		} catch (Exception e) {
			if (debug)
				e.printStackTrace();
			throw new GreffonException("Impossible de se connecter au serveur : " + e.getMessage());
		}
	}

	@Slot
	public boolean fermer() throws GreffonException {
		verifierSocket();
		try {
			socket.close();
			socket = null;
			return true;
		} catch (Exception e) {
			if (debug)
				e.printStackTrace();
			throw new GreffonException("Impossible de fermer la connexion : " + e.getMessage());
		}
	}

	private void verifierSocket() throws GreffonException {
		if (socket == null)
			throw new GreffonException("Le socket n'est pas ouverte");
	}

	@Slot
	public boolean envoyer(ObjetLinotte acteur) throws GreffonException {
		verifierSocket();
		try {
			ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
			oos.writeObject(acteur);
			oos.flush();
			return true;
		} catch (Exception e) {
			if (debug)
				e.printStackTrace();
			throw new GreffonException("Impossible d'envoyer l'acteur : " + e.getMessage());
		}
	}

	@Slot
	public ObjetLinotte recevoir() throws GreffonException {
		verifierSocket();
		try {
			ObjectInputStream oos = new ObjectInputStream(socket.getInputStream());
			return (ObjetLinotte) oos.readObject();
		} catch (Exception e) {
			if (debug)
				e.printStackTrace();
			throw new GreffonException("Impossible de recevoir l'acteur : " + e.getMessage());
		}
	}

	@Slot
	public String nommachine() throws GreffonException {
		try {
			return InetAddress.getLocalHost().getHostName();
		} catch (Exception e) {
			if (debug)
				e.printStackTrace();
			return "localhost";
		}
	}

	@Slot(nom = "débogage")
	public boolean debogage(boolean debog) throws GreffonException {
		debug = debog;
		return false;
	}
}
